package io.xiaojl.xj2ee.modules.sys.service.impl;

import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import io.xiaojl.xj2ee.common.exception.XjeeException;
import io.xiaojl.xj2ee.common.kit.PageWrapper;
import io.xiaojl.xj2ee.common.kit.json.JsonKit;
import io.xiaojl.xj2ee.kit.JpaPageKit;
import io.xiaojl.xj2ee.modules.sys.entity.SysConfigEntity;
import io.xiaojl.xj2ee.modules.sys.repository.SysConfigRepository;
import io.xiaojl.xj2ee.modules.sys.service.SysConfigService;
import io.xiaojl.xj2ee.redis.SysConfigRedisService;


@Service("sysConfigService")
public class SysConfigServiceImpl implements SysConfigService {
	@Autowired
	private SysConfigRedisService sysConfigRedis;
	@Autowired
	private SysConfigRepository sysConfigRepository;
	
	@Override
    public PageWrapper<SysConfigEntity> queryPage(Map<String, Object> params) {
		PageWrapper<SysConfigEntity> pageWrapper = new PageWrapper<SysConfigEntity>(params);
		Pageable pageable = JpaPageKit.getPageable(pageWrapper);
		Page<SysConfigEntity> page = sysConfigRepository.findAll(pageable);
		
		pageWrapper.setList(page.getContent());
		pageWrapper.setTotalCount(Integer.parseInt(page.getTotalElements()+""));
		pageWrapper.setTotalPage(page.getTotalPages());
        return pageWrapper;
    }
	
    @Override
	public void save(SysConfigEntity config) {
    	sysConfigRepository.saveAndFlush(config);
		sysConfigRedis.saveOrUpdate(config);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void update(SysConfigEntity config) {
		sysConfigRepository.saveAndFlush(config);
		sysConfigRedis.saveOrUpdate(config);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void updateValueByKey(String key, String value) {
		sysConfigRepository.updateValueByKey(key, value);
		sysConfigRedis.delete(key);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void deleteBatch(Long[] ids) {
		for(Long id : ids){
			SysConfigEntity config = sysConfigRepository.getOne(id);
			sysConfigRepository.deleteById(id);
			sysConfigRedis.delete(config.getParamKey());
		}
	}

	@Override
	public String getValue(String key) {
		SysConfigEntity config = sysConfigRedis.get(key);
		if(config == null){
			config = sysConfigRepository.findByParamKey(key);
			sysConfigRedis.saveOrUpdate(config);
		}
		return config == null ? null : config.getParamValue();
	}
	
	@Override
	public <T> T getConfigObject(String key, Class<T> clazz) {
		String value = getValue(key);
		if(StringUtils.isNotBlank(value)){
			return JsonKit.toObj(value, clazz);
		}
		try {
			return clazz.newInstance();
		} catch (Exception e) {
			throw new XjeeException("获取参数失败");
		}
	}

	@Override
	public SysConfigEntity selectById(Long id) {
		return sysConfigRepository.getOne(id);
	}
}
